import { Entity, Column, Index } from "typeorm";
import { BaseEntity } from "@/common/entities/base.entity";

/**
 * 性能指标实体
 * 用于存储页面性能数据，基于Navigation Timing API的各项性能指标
 */
@Entity("performance_metrics")
export class PerformanceMetricEntity extends BaseEntity {
  /**
   * 用户ID
   * 访问页面的用户唯一标识，可为空表示未登录用户
   */
  @Column({ type: "varchar", length: 64, nullable: true, comment: "用户ID" })
  @Index("idx_user_id")
  userId: string;

  /**
   * 页面URL
   * 用户访问的完整页面地址
   */
  @Column({ type: "varchar", length: 500, comment: "页面URL" })
  pageUrl: string;

  /**
   * 页面标题
   * 访问页面的标题文本
   */
  @Column({ type: "varchar", length: 255, nullable: true, comment: "页面标题" })
  pageTitle: string;

  /**
   * 导航开始时间
   * 浏览器开始获取文档的时间，即用户点击链接或输入URL的时间
   */
  @Column({ type: "float", nullable: true, comment: "导航开始时间" })
  navigationStart: number;

  /**
   * 卸载事件开始时间
   * 如果前一个文档需要卸载，此时间为卸载事件开始的时间
   */
  @Column({ type: "float", nullable: true, comment: "卸载事件开始时间" })
  unloadEventStart: number;

  /**
   * 卸载事件结束时间
   * 前一个文档卸载完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "卸载事件结束时间" })
  unloadEventEnd: number;

  /**
   * 重定向开始时间
   * 如果有重定向，此时间为开始重定向的时间
   */
  @Column({ type: "float", nullable: true, comment: "重定向开始时间" })
  redirectStart: number;

  /**
   * 重定向结束时间
   * 重定向完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "重定向结束时间" })
  redirectEnd: number;

  /**
   * 获取开始时间
   * 浏览器开始检查缓存或开始从服务器获取文档的时间
   */
  @Column({ type: "float", nullable: true, comment: "获取开始时间" })
  fetchStart: number;

  /**
   * 域名查找开始时间
   * 开始DNS域名解析的时间
   */
  @Column({ type: "float", nullable: true, comment: "域名查找开始时间" })
  domainLookupStart: number;

  /**
   * 域名查找结束时间
   * DNS域名解析完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "域名查找结束时间" })
  domainLookupEnd: number;

  /**
   * 连接开始时间
   * 开始建立TCP连接的时间
   */
  @Column({ type: "float", nullable: true, comment: "连接开始时间" })
  connectStart: number;

  /**
   * 连接结束时间
   * TCP连接建立完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "连接结束时间" })
  connectEnd: number;

  /**
   * 安全连接开始时间
   * 如果是HTTPS，此时间为开始SSL握手的时间
   */
  @Column({ type: "float", nullable: true, comment: "安全连接开始时间" })
  secureConnectionStart: number;

  /**
   * 请求开始时间
   * 浏览器开始向服务器发送HTTP请求的时间
   */
  @Column({ type: "float", nullable: true, comment: "请求开始时间" })
  requestStart: number;

  /**
   * 响应开始时间
   * 浏览器开始接收到服务器响应的时间
   */
  @Column({ type: "float", nullable: true, comment: "响应开始时间" })
  responseStart: number;

  /**
   * 响应结束时间
   * 浏览器完成接收服务器响应的时间
   */
  @Column({ type: "float", nullable: true, comment: "响应结束时间" })
  responseEnd: number;

  /**
   * DOM加载开始时间
   * 浏览器开始解析DOM的时间
   */
  @Column({ type: "float", nullable: true, comment: "DOM加载开始时间" })
  domLoading: number;

  /**
   * DOM交互时间
   * 文档解析完成，DOM树构建完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "DOM交互时间" })
  domInteractive: number;

  /**
   * DOM内容加载开始时间
   * DOMContentLoaded事件开始的时间
   */
  @Column({ type: "float", nullable: true, comment: "DOM内容加载开始时间" })
  domContentLoadedEventStart: number;

  /**
   * DOM内容加载结束时间
   * DOMContentLoaded事件完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "DOM内容加载结束时间" })
  domContentLoadedEventEnd: number;

  /**
   * DOM完成时间
   * 文档和所有子资源完全加载完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "DOM完成时间" })
  domComplete: number;

  /**
   * 加载事件开始时间
   * load事件开始的时间
   */
  @Column({ type: "float", nullable: true, comment: "加载事件开始时间" })
  loadEventStart: number;

  /**
   * 加载事件结束时间
   * load事件完成的时间，页面完全加载完成
   */
  @Column({ type: "float", nullable: true, comment: "加载事件结束时间" })
  loadEventEnd: number;

  /**
   * 首次绘制时间
   * 浏览器首次将像素绘制到屏幕的时间
   */
  @Column({ type: "float", nullable: true, comment: "首次绘制时间" })
  firstPaint: number;

  /**
   * 首次内容绘制时间
   * 浏览器首次绘制任何文本、图像、非白色canvas或SVG的时间
   */
  @Column({ type: "float", nullable: true, comment: "首次内容绘制时间" })
  firstContentfulPaint: number;

  /**
   * 最大内容绘制时间
   * 视口中最大内容元素绘制完成的时间
   */
  @Column({ type: "float", nullable: true, comment: "最大内容绘制时间" })
  largestContentfulPaint: number;

  /**
   * 首次输入延迟
   * 用户首次与页面交互到浏览器响应的时间
   */
  @Column({ type: "float", nullable: true, comment: "首次输入延迟" })
  firstInputDelay: number;

  /**
   * 累积布局偏移
   * 页面生命周期内发生的所有意外布局偏移的累积分数
   */
  @Column({ type: "decimal", precision: 10, scale: 2, nullable: true, comment: "累积布局偏移" })
  cumulativeLayoutShift: number;

  /**
   * 浏览器类型
   * 用户使用的浏览器名称和版本，如：Chrome/91.0.4472.124
   */
  @Column({ type: "varchar", length: 50, nullable: true, comment: "浏览器类型" })
  browser: string;

  /**
   * 操作系统
   * 用户设备的操作系统信息，如：Windows 10, macOS 11.2.3
   */
  @Column({ type: "varchar", length: 50, nullable: true, comment: "操作系统" })
  os: string;

  /**
   * IP地址
   * 用户的IP地址，用于地理位置分析
   */
  @Column({ type: "varchar", length: 45, nullable: true, comment: "IP地址" })
  ipAddress: string;

  /**
   * 用户代理字符串
   * 完整的User-Agent字符串，包含设备、浏览器、操作系统等详细信息
   */
  @Column({ type: "text", nullable: true, comment: "用户代理字符串" })
  userAgent: string;

  /**
   * 测量时间
   * 性能数据实际测量的时间
   */
  @Column({ type: "datetime", nullable: true, comment: "测量时间" })
  measuredAt: Date;
}